package com.git.dengchongshuang.managementsystem;

import com.git.dengchongshuang.managementsystem.exception.*;

import java.util.*;

//定义通讯录中的联系人和相关操作的方法
public class OperateContacts {
    //存储联系人信息的数据结构，自带去重
    private static final LinkedHashMap<String,Contact> contacts = new LinkedHashMap<>();

    //根据电话号码查找联系人信息
    public static Contact getContactByPhoneNumber(String phoneNumber) {
        if(!contacts.containsKey(phoneNumber)) {
            throw new SearchByPhoneException("电话号码为："+phoneNumber+"的联系人未找到！");
        }
        return contacts.get(phoneNumber);
    }

    private static void update(String oldPhoneNumber, Contact newCon) {
        if (!contacts.containsKey(oldPhoneNumber)){
            throw new UpdateException("电话号码为："+oldPhoneNumber+"的联系人未找到！");
        }

        //没有更改电话号码
        if(oldPhoneNumber.equals(newCon.getPhoneNumber())){
            contacts.replace(oldPhoneNumber,newCon);
        }else {
            contacts.remove(oldPhoneNumber);
            Contact putResult = contacts.put(newCon.getPhoneNumber(), newCon);
            if(putResult == null){
                throw new AddException("添加联系人失败！");
            }
        }

    }

    //获取所有联系人信息，返回一个ArrayList
    public static ArrayList<Contact> getAllContact() {
        ArrayList<Contact> re = new ArrayList<>(contacts.values());
        if(re.isEmpty()){
            throw new NotHaveContactException("通讯录为空！");
        }
        return re;
    }

    /*下面的才是提供给其他模块的接口，增删改查--------------------------------------------------*/

    //添加联系人信息，添加失败抛出一个异常
    public static void add(Contact contact) {
        if (contacts.containsKey(contact.getPhoneNumber())) {
            throw new AddException("电话号码为："+contact.getPhoneNumber()+"的联系人已存在！");
        }
        contacts.put(contact.getPhoneNumber(), contact);
    }

    //删除联系人信息，删除失败抛出一个异常
    public static void remove(Contact contact) {
        if(!contacts.containsKey(contact.getPhoneNumber())){
            throw new RemoveException("电话号码为："+contact.getPhoneNumber()+"的联系人不存在！");
        }
        contacts.remove(contact.getPhoneNumber());
    }

    //通过姓名返回指定联系人信息，ArrayList
    public static List<Contact> getContactByName(String name) {
        ArrayList<Contact> re = new ArrayList<>();
        for (Contact contact : contacts.values()) {
            if (contact.getName().equals(name)){
                re.add(contact);
            }
        }
        if (re.isEmpty()){
            throw new SearchByNameException("名字为："+name+"的联系人信息不存在！");
        }
        return re;
    }


    //获取联系人信息，按照姓名字母排字典序
    public static ArrayList<Contact> getAllContactOrderByName() {
        ArrayList<Contact> allContact = getAllContact();
        allContact.sort(new Comparator<Contact>() {
            @Override
            public int compare(Contact o1, Contact o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        return allContact;
    }

    //获取联系人信息，按照电话号码排序
    public static List<Contact> getAllContactOrderByPhoneNumber() {
        List<Contact> allContact = getAllContact();
        allContact.sort(new Comparator<Contact>() {
            @Override
            public int compare(Contact o1, Contact o2) {
                return o1.getPhoneNumber().compareTo(o2.getPhoneNumber());
            }
        });
        return allContact;
    }

}
